package org.ciallo.simplemusicplayer.data.model;

import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.ForeignKey;
import androidx.room.Index;

/**
 * @author Jukomu
 * @Description: 用于表示歌单（Playlist）和歌曲（Song）之间多对多关系的交叉引用实体
 * @Package: org.ciallo.simplemusicplayer.data.model
 * @Project: SimpleMusicPlayer
 * @name: PlaylistSongCrossRef
 * @Date: 2025/5/30-00:58
 * @Filename: PlaylistSongCrossRef
 */
@Entity(tableName = "playlist_song_cross_ref",
        primaryKeys = {"playlist_id", "song_id"}, // 复合主键
        indices = {
                @Index("song_id"), // 为 song_id 创建索引，方便查询
                @Index("playlist_id")  // 为 playlist_id 创建索引，方便查询和排序
        },
        foreignKeys = {
                @ForeignKey(entity = Playlist.class,
                        parentColumns = "id",
                        childColumns = "playlist_id",
                        onDelete = ForeignKey.CASCADE), // 如果歌单被删除，其所有关联歌曲记录也随之删除
                @ForeignKey(entity = Song.class,       // Song 必须也是一个 @Entity
                        parentColumns = "id",
                        childColumns = "song_id",
                        onDelete = ForeignKey.CASCADE)  // 如果歌曲从数据库中被删除，其在所有歌单中的关联也删除
        })
public class PlaylistSongCrossRef {

    /**
     * 关联的歌单ID。
     */
    @ColumnInfo(name = "playlist_id")
    public long playlistId;

    /**
     * 关联的歌曲ID。
     */
    @ColumnInfo(name = "song_id")
    public long songId;

    /**
     * 歌曲在歌单中的顺序/位置。
     * 可以用于支持歌单内歌曲的自定义排序。
     */
    @ColumnInfo(name = "position_in_playlist")
    public int positionInPlaylist;

    /**
     * 构造函数。
     * @param playlistId 歌单ID。
     * @param songId     歌曲ID。
     * @param positionInPlaylist 歌曲在该歌单中的位置。
     */
    public PlaylistSongCrossRef(long playlistId, long songId, int positionInPlaylist) {
        this.playlistId = playlistId;
        this.songId = songId;
        this.positionInPlaylist = positionInPlaylist;
    }
}
